package com.tmt.im.service.interfaces;

import com.tmt.im.common.vo.NewChatSessionVo;
import com.tmt.im.service.controller.vo.*;
import com.tmt.springboot.chain._DynamicInterface;
import com.tmt.springboot.common.restful.IExecuteResult;

import java.security.Principal;

/**
 * 聊天群组管理器接口
 *
 * @Description TODO
 * @Author wuyi
 * @Date 2024/8/28 9:55
 * @Version 1.0
 **/
@_DynamicInterface
public interface IChatSessionManager {

    /**
     * 创建聊天群组
     *
     * @param creatorId
     * @param newSession
     * @param error
     * @return
     */
    ChatSessionDetailVo createSession(Long creatorId, NewChatSessionVo newSession, StringBuilder error);

    /**
     * 获取群组基本信息。
     *
     * @param operatorId
     * @param tid
     * @param principal
     * @param error
     * @return
     */
    ChatSessionDetailVo getSessionDetail(Long operatorId, Long tid, Principal principal, StringBuilder error);

    /**
     * 更新群组配置信息
     *
     * @param operatorId
     * @param request
     * @param principal
     * @return
     */
    IExecuteResult<ChatSessionDetailVo> updateSession(Long operatorId, UpdateSessionRequest request, Principal principal);

    /**
     * 解散群组。
     *
     * @param operatorId
     * @param tid
     * @param principal
     * @param error
     * @return
     */
    boolean deleteSession(Long operatorId, Long tid, Principal principal, StringBuilder error);

    /**
     * 群组禁言
     *
     * @param operatorId
     * @param request
     * @param principal
     * @param error
     * @return
     */
    boolean bannedSession(Long operatorId, SessionBannedRequest request, Principal principal, StringBuilder error);

    /**
     * 修改入群审核策略
     *
     * @param operatorId
     * @param request
     * @param principal
     * @param error
     * @return
     */
    boolean changeJoinMode(Long operatorId, SessionJoinModeRequest request, Principal principal, StringBuilder error);

    /**
     * 转让群主
     *
     * @param operatorId
     * @param request
     * @param principal
     * @param error
     * @return
     */
    boolean transferSession(Long operatorId, TransferOwnerRequest request, Principal principal, StringBuilder error);

    /**
     * 添加管理员
     *
     * @param operatorId
     * @param request
     * @param principal
     * @param error
     * @return
     */
    boolean addManager(Long operatorId, NewManagerRequest request, Principal principal, StringBuilder error);

    /**
     * 移除管理员
     *
     * @param operatorId
     * @param request
     * @param principal
     * @param error
     * @return
     */
    boolean removeManager(Long operatorId, NewManagerRequest request, Principal principal, StringBuilder error);

    /**
     * 获取用户在某个群组中的详情信息。
     *
     * @param operatorId
     * @param tid
     * @return
     */
    IExecuteResult<MemberInfo> getMemberDetailInSession(Long operatorId, Long tid);

    /**
     * 滑动查询群组成员列表。
     *
     * @param operatorId
     * @param request
     * @return
     */
    IExecuteResult<QueryMembersResponse> slideQueryMemberInSession(Long operatorId, SlideQueryRequest request);

    /**
     * 分页查询群组成员列表。
     *
     * @param currentUserId
     * @param tid
     * @param pageIndex
     * @return
     */
    IExecuteResult<QueryMembersResponse1> pageQueryMemberInSession(long currentUserId, long tid, int pageIndex, int pageSize);


    /**
     * 将用户拉入或踢出群黑名单。
     *
     * @param currentUserId
     * @param request
     * @return
     */
    IExecuteResult<Boolean> pullInBlackBill(Long currentUserId, SessionBlackBillRequest request);

    /**
     * 分页获取群黑名单。
     * @param tid
     * @param pageIndex
     * @param pageSize
     * @return
     */
    IExecuteResult<BlackBillResponse> listBlackBill(Long tid, int pageIndex, int pageSize);
}
